In [1]:
%pylab inline
import numpy as np #  convert list to array

import matplotlib.pyplot as plt
Populating the interactive namespace from numpy and matplotlib

Multirétegek tervezése transzfermátrix-módszerrel

(design of coatings with transfer matrix method)

Multirétegek optikai reflexiójának, transzmiszójának számolása a rétegekre merőlegesen haladó fényre.

Két elemi transzfermátrixból tetszőleges multiréteg transzfermátrixa felépíthető. A két elemi transzfermátrix:

1) A két közeg határának a bal és jobb oldalán $n_1$ és $n_2$ a törésmutató:

\begin{equation} {\bf M}(n_2,n_1) = \frac{1}{2}\, \left( \begin{array}{cc} \frac{n_1}{n_2}+1 & \frac{n_1}{n_2}-1 \\ \frac{n_1}{n_2}-1 & \frac{n_1}{n_2}+1 \end{array} \right). \nonumber \end{equation}

2) Egy $L$ vastagságú közegben a szabad terjedés transzfermátrixa:

\begin{equation} {\bf F}(k L) = \left( \begin{array}{cc} e^{i k L} & 0 \\[1ex] 0 & e^{-i k L} \end{array} \right),\nonumber \end{equation} ahol $k$ a hullámszám a közegben és $L$ a réteg vastagsága.

Feltevés: a fénysugár balról jobbra halad (vagy fentről lefelé az ábrától függően), ezért az $M$ mátrixok szorzása jobbról balra történik.

Merőleges beesésnél a TM ($\mathbf{E}$ a beesési síkban, azaz a papír síkjában van) és a TE módusra ugyanazt az eredményt kapjuk.

Különböző anyagok törésmutatója itt található: Filmetrics

In [2]:
def Mb(n2,n1):
    res=1/2*(matrix([[1+n1/n2,n1/n2-1],
                    [n1/n2-1,1+n1/n2]]))
    return(res)

def Mfree(kL):
    #res=matrix([[exp(1j*kL),0+0*1j],[0+0*1j,exp(-1j*kL)]])
    res=matrix([[exp(1j*kL),0],[0,exp(-1j*kL)]])
    return(res)

def ref_trans(M,nR,nL):
    detM = det(M)
    r=-M[1,0]/M[1,1]
    t= detM/M[1,1]
    
    RR=(abs(r))**2
    TT=nR/nL*(abs(t))**2
    check = RR+TT   
        
    return(r,t,RR,TT,check,detM)
In [3]:
def egy_reteg(x,nvec,kappavec):

    nL, n1, nR = nvec
    kappaL, kappa1,kappaR = kappavec

    # Transfer matrix for 1 layers: 
    #Mtot=Mb(nR, n1)*Mfree(a1/x)*Mb(n1, nL)
    Mtot = Mb(nR, n1*(1+1j*kappa1))*Mfree(pi/2*x*(1+1j*kappa1))*Mb(n1*(1+1j*kappa1), nL);
    
    # Extracting the reflection/transmission amplitudes, etc. 
    r,t,RR,TT,check,detM =ref_trans(Mtot,nR,nL)
        
    return(r,t,RR,TT,check,detM)

def ket_reteg(x,nvec,kLvec):

    nL, n1, n2, nR = nvec
    a1, a2 = kLvec

    # Transfer matrix for 2 layers: 
    Mtot=Mb(nR, n2)*Mfree(a2/x)*Mb(n2, n1)*Mfree(a1/x)*Mb(n1, nL)
    
    # Extracting the reflection/transmission amplitudes, etc. 
    r,t,RR,TT,check,detM =ref_trans(Mtot,nR,nL)
        
    return(r,t,RR,TT,check,detM)


def harom_reteg(x,nvec,kLvec):

    nL, n1, n2, n3, nR = nvec
    a1, a2, a3 = kLvec

    # Transfer matrix for 3 layers: 
    Mtot=Mb(nR, n3)*Mfree(a3/x)*Mb(n3, n2)*Mfree(a2/x)*Mb(n2, n1)*Mfree(a1/x)*Mb(n1, nL)
    
    # Extracting the reflection/transmission amplitudes, etc. 
    r,t,RR,TT,check,detM =ref_trans(Mtot,nR,nL)
        
    return(r,t,RR,TT,check,detM)

Tükrözésmentes multirétegek (anti-reflection coatings)

$R(\lambda_0)$

Here $\lambda_0$ is the incident wavelength of light coming from the vacuum.

We set the reference wave length $\lambda_r$ such that $R(\lambda_0 = \lambda_r) =0$.

Here for example a quarter-wave film means that $ n L = \frac{\lambda_0}{4}$, where $n$ and $L$ are the refraction index and the thickness of the film, while $\lambda_0$ is the wave length in the vacuum.

Then $k L = k_0 n L = k_0 \frac{\lambda_0}{4} = \frac{2\pi}{\lambda_0}\, \frac{\lambda_0}{4} = \frac{\pi}{2}$, where $k =n k_0$ and $k_0$ are the wave numbers in the film and the vacuum.

Reflectivity of the two layer AR coating

A. Nussbaum & R. A. Phillips: Modern optika mérnököknek és kutatóknak, Műszaki Könykiadó, 1982. , 169. oldal, 8-10. és 8.11 ábra

Itt a fénysugár fentről lefelé halad.

In [12]:
nvec=[1, 1.4, 2., 1.62]
kLvec=[pi/2, pi]


Npoints = 300
xmin = 0.25;
xmax = 1.7 #   1.23;

xvec=linspace(xmin,xmax, Npoints)

res=array([array(ket_reteg(x,nvec,kLvec)) for x in xvec])
Rvec=[real(100*res[i][2]) for i in range(len(res))] 


xvec_ticks=[0.38, 0.498, 0.6, 0.8, 1, 1.2]
res_ticks=array([array(ket_reteg(x,nvec,kLvec)) for x in xvec_ticks])
Rvec_ticks=[100*real(res_ticks[i][2]) for i in range(len(xvec_ticks))] 

xs=[]
for m in xvec_ticks:
    if (m ==1):
        xs.append(r'$\,\lambda_0$')
    else:
        if(m == xvec_ticks[1]):
            xs.append('') 
        else:
            xs.append(str(m) +r'$\,\lambda_0$')     
labels = xs
xticks(xvec_ticks,labels,fontsize=16)

#[print('lambda = ', xvec_ticks[i], ',  R (%) = ', around(Rvec_ticks[i],2)) for i in range(len(xvec_ticks))]

figsize(12,6)

plot(xvec,Rvec)

title('Reflectivity of the two layer AR coating \n as a function of the incident wavelength', fontsize=16)
xlabel(r'$\lambda$', fontsize=20)
ylabel('R (%)',rotation=0,fontsize=16, labelpad=30)
axis('tight')

grid();

Reflectivity of the three layer AR coating

K. K. Sharma: Optics Principle and Application page 312, Fig. 6.38

Itt a fénysugár fentről lefelé halad.

In [5]:
nvec=[1, 1.38, 2.3, 1.76, 1.62]
kLvec=[pi/2, pi, 3*pi/2]

Npoints = 100
xmin = 0.8;
xmax = 625/500 #   1.23;

xvec=linspace(xmin,xmax, Npoints)

res=array([array(harom_reteg(x,nvec,kLvec)) for x in xvec])
Rvec=[real(100*res[i][2]) for i in range(len(res))] 

lamref=500 # \lambda reference, $\lamabda_r = 500 $ nm

#array(M).flatten()  #  convert Matrix M to array 
xvecl=array(matrix(xvec)*lamref).flatten()  # xvecl ---> lambda_0 ugy, hogy lambda_0 = lambda_r -nel 
                                            # zerus legyen R. 

figsize(10,6)

plot(xvecl,Rvec)

title('Reflectivity of the three layer AR coating \n as a function of the incident wavelength ' + r'$\lambda_0 ,$' + 
      '\n reference wave length '+ r'$\lambda_r = $' + str(lamref)+' nm', fontsize=16)
xlabel(r'$\lambda_0$'+' (nm)', fontsize=20)
ylabel('R (%)',rotation=0,fontsize=16, labelpad=30)
axis('tight')

grid();

Reflectivity $R$, Transmission $T$ and the Absorption $A = 1-T-R$ of a metallic film

Az alábbi eredmény megtalálható Max Born and Emil Wolf: Principles of optics (7th Eds., Cambridge Univ. Press, 1999) könyvében a 757. oldalon, Fig. 14.5. vagy a 6th Eds., 1980 kiadásban a 655. oldalon. Az eredeti cikk: K. Hammer, Z. Tech. Phys. 24, 169 (1943).

Megj.:A könyvben használt képletek sokkal bonyolultabbak, mint a fenti módszer.

Itt a fénysugár fentről lefelé halad.

A középső réteg fémből van, ezért a törésmutatója komplex szám, azaz $\hat{n} = n_1(1+i\kappa_1)$.

In [6]:
nvec=[1, 3.5 ,1.5]
kappavec = [0, 0.1, 0]

#kLvec = [pi/2]

Npoints = 100

xmin = 0.01
xmax = 5.7

xvec=linspace(xmin,xmax, Npoints)

res=array([array(egy_reteg(x,nvec,kappavec)) for x in xvec])
Rvec=[real(100*res[i][2]) for i in range(len(res))] 
Tvec=[real(100*res[i][3]) for i in range(len(res))] 
Avec=[100-real(100*res[i][2])-real(100*res[i][3]) for i in range(len(res))] 


figsize(10,6)

plot(xvec,Rvec,'b-',label='R')
plot(xvec,Tvec, 'r-',label='T')
plot(xvec,Avec, 'k-',label='A')

title('Absorption $A= 1-T-R$ and $R, T$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$',\
      fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\,  units\,  of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('R (%)',rotation=0,fontsize=16, labelpad=30)
axis('tight')

legend(loc='upper right',fontsize = 15)

text(0.8,85,'$n_L, n_1, n_R =$'+str(nvec),fontsize=15)
text(0.8,75,'$\kappa_L, \kappa_1, \kappa_R =$'+str(kappavec),fontsize=15)

grid();
In [7]:
nvec=[1, 3.5 ,1.5]

Npoints = 100
xmin = 0.01
xmax = 5.7

xvec=linspace(xmin,xmax, Npoints)

kappavec1 = [0,0.1,0]
res1=array([array(egy_reteg(x,nvec,kappavec1)) for x in xvec])
Rvec1=[real(100*res1[i][2]) for i in range(len(res1))] 

kappavec2 = [0,0.2,0]
res2=array([array(egy_reteg(x,nvec,kappavec2)) for x in xvec])
Rvec2=[real(100*res2[i][2]) for i in range(len(res2))] 

kappavec3 = [0,0.,0]
res3=array([array(egy_reteg(x,nvec,kappavec3)) for x in xvec])
Rvec3=[real(100*res3[i][2]) for i in range(len(res3))] 


figsize(10,6)

plot(xvec,Rvec1,'b-',label=r'$\kappa_1 = $'+str(kappavec1[1]))
plot(xvec,Rvec2,'k--',label=r'$\kappa_1 = $'+str(kappavec2[1]))
plot(xvec,Rvec3,'r--',label=r'$\kappa_1 = $'+str(kappavec3[1]))


title('Reflectivity $R$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$',fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\,  units\,  of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('R (%)',rotation=0,fontsize=16, labelpad=30)
#axis('tight')

legend(loc='upper right',fontsize = 15)

#text(0.8,85,'$n_L, n_1, n_R =$'+str(nvec),fontsize=15)
#text(0.8,75,'$\kappa_L, \kappa_1, \kappa_R =$'+str(kappavec),fontsize=15)

grid();
In [8]:
nvec=[1, 3.5 ,1.5]

#kLvec = [pi/2]

Npoints = 100

xmin = 0.01
xmax = 5.7

xvec=linspace(xmin,xmax, Npoints)

kappavec1 = [0,0.1,0]
res1=array([array(egy_reteg(x,nvec,kappavec1)) for x in xvec])
Tvec1=[real(100*res1[i][3]) for i in range(len(res1))] 

kappavec2 = [0,0.2,0]
res2=array([array(egy_reteg(x,nvec,kappavec2)) for x in xvec])
Tvec2=[real(100*res2[i][3]) for i in range(len(res2))] 

kappavec3 = [0,0.,0]
res3=array([array(egy_reteg(x,nvec,kappavec3)) for x in xvec])
Tvec3=[real(100*res3[i][3]) for i in range(len(res3))] 


figsize(10,6)

plot(xvec,Tvec1,'b-',label=r'$\kappa_1 = $'+str(kappavec1[1]))
plot(xvec,Tvec2,'k--',label=r'$\kappa_1 = $'+str(kappavec2[1]))
plot(xvec,Tvec3,'r--',label=r'$\kappa_1 = $'+str(kappavec3[1]))


title('Transmission $T$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$', fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\,  units\,  of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('T (%)',rotation=0,fontsize=16, labelpad=30)
#axis('tight')

legend(loc='upper right',fontsize = 15)

#text(0.8,85,'$n_L, n_1, n_R =$'+str(nvec),fontsize=15)
#text(0.8,75,'$\kappa_L, \kappa_1, \kappa_R =$'+str(kappavec),fontsize=15)

grid();
In [9]:
figsize(10,6)

Avec1= array([100-Rvec1[i]-Tvec1[i] for i in range(len(xvec))])
plot(xvec,Avec1,'g-',lw=2,label=r'$A$')
plot(xvec,Rvec1,'b-',label=r'$R$')
plot(xvec,Tvec1,'r-',label=r'$T$')

title('Absorption $A= 1-T-R$ and $R, T$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$', fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\,  units\,  of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('T (%)',rotation=0,fontsize=16, labelpad=30)
#axis('tight')

text(2,75,r'$\kappa_1 =$'+str(kappavec1[1]), fontsize=18)
legend(loc='upper right',fontsize = 15)


grid();
In [10]:
figsize(10,6)

Avec2= array([100-Rvec2[i]-Tvec2[i] for i in range(len(xvec))])
plot(xvec,Avec2,'g-',lw=2,label=r'$A$')
plot(xvec,Rvec2,'b-',label=r'$R$')
plot(xvec,Tvec2,'r-',label=r'$T$')

title('Absorption $A= 1-T-R$ and $R, T$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$', fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\,  units\,  of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('T (%)',rotation=0,fontsize=16, labelpad=30)
#axis('tight')

text(2,75,r'$\kappa_1 =$'+str(kappavec2[1]), fontsize=18)
legend(loc='upper right',fontsize = 15)


grid();
In [11]:
figsize(10,6)

Avec3= array([100-Rvec3[i]-Tvec3[i] for i in range(len(xvec))])
plot(xvec,Avec3,'g-',lw=2,label=r'$A$')
plot(xvec,Rvec3,'b-',label=r'$R$')
plot(xvec,Tvec3,'r-',label=r'$T$')

title('Absorption $A= 1-T-R$ and $R, T$ of a metallic film \n as functions of its optical thickness ' + r'$n_1 L_1$', fontsize=16)
xlabel(r'$L_1 \mathrm{\, in\,  units\,  of\,\, } \frac{\lambda_0}{4 n_1}$', fontsize=20)
ylabel('T (%)',rotation=0,fontsize=16, labelpad=30)
#axis('tight')

text(2,75,r'$\kappa_1 =$'+str(kappavec3[1]), fontsize=18)
legend(loc='upper right',fontsize = 15)


grid();